﻿using GrabFieldr.Models.Impls.Tools;
using GrabFieldr.Models.Interface.Tools;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using static System.Runtime.InteropServices.JavaScript.JSType;

namespace GrabFieldr.Models.Impls.Tools
{
    /// <summary>
    /// 定时获取当前时间
    /// </summary>
    public class DateTimer : IDateTimer
    {
        private System.Timers.Timer DateNumTimer { get; set; }
        // 定时间隔（毫秒）
        public int TimeInterval { get; set; } = 500;
        //状态改变事件
        public event EventHandler? StateChanged;
        //当前时间
        public string _FormattedTimee;
        //当前日期
        int WeekIndex { get; set; }

        public string FormattedTime
        {
            get => _FormattedTimee;
            set
            {
                // guard clause：空检查
                if (value == null)
                    throw new ArgumentNullException(nameof(value), "HiwoState cannot be null");

                // 只有值发生变化时才更新和通知
                if (_FormattedTimee != value)
                {

                    string oldValue = _FormattedTimee; // 保存旧值
                    _FormattedTimee = value; // 更新字段
                                        // 调用方法触发事件，通知所有订阅者属性已更改
                    OnPropertyChanged(nameof(FormattedTime), oldValue, _FormattedTimee);
                }
            }
        }
        public DateTimer()
        {
            DateNumTimer = new System.Timers.Timer(TimeInterval);
            TimerInit();
        }

        /// <summary>
        /// 定时器初始化
        /// </summary>
        private void TimerInit()
        {
            // 绑定异步事件处理方法（注意使用async void）
            DateNumTimer.Elapsed += async (sender, e) => await OnTimedEventAsync();

            DateNumTimer.AutoReset = true; // 循环触发
            DateNumTimer.Enabled = true;   // 启动定时器
        }

        /// <summary>
        /// 异步任务方法（返回Task）
        /// </summary>
        private async Task OnTimedEventAsync()
        {
            // 获取当前时间并格式化为字符串（包含毫秒）
            DateTime currentTime = DateTime.Now;
            FormattedTime = currentTime.ToString("HH:mm:ss"); // 24小时制，精确到毫秒

            WeekIndex = (int)DateTime.Now.DayOfWeek; // 获取索引 (0 是星期日)
        }

        // 受保护的虚方法，用于触发事件[4](@ref)
        // 定义为虚方法允许子类重写事件触发逻辑
        /// <summary>
        ///     受保护的虚方法，用于触发事件[4](@ref) 定义为虚方法允许子类重写事件触发逻辑
        /// </summary>
        /// <param name="propertyName"></param>
        /// <param name="oldValue"></param>
        /// <param name="newValue"></param>
        public virtual void OnPropertyChanged(string propertyName, object oldValue, object newValue)
        {
            // 使用空条件操作符(?.)安全地触发事件，避免没有订阅者时出现NullReferenceException[4,7](@ref)
            // this 指当前A类的实例，作为事件发送者
            PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName, oldValue, newValue));
        }
        /// <summary>
        /// 更新事件
        /// </summary>
        public event EventHandler<GrabFieldr.Models.Impls.Tools.PropertyChangedEventArgs>? PropertyChanged;

    }
}
